#include <stdio.h>
#include <stdbool.h>
#include <string.h>

/*
 * 给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。
 *
 * 示例 1:
 *   输入: s = "abcabcbb"
 *   输出: 3
 *   解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
 *
 * 示例 2:
 *   输入: s = "bbbbb"
 *   输出: 1
 *   解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
 *
 * 示例 3:
 *   输入: s = "pwwkew"
 *   输出: 3
 *   解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
 */

int lengthOfLongestSubstring(char *s)
{
    int ret = 0, _ret = 0;
    int pos[128] = {0}, i = 0;
    char *reBuildValuePtr;
    char *_s = s;
    while (*_s != 0)
    {
        i++;
        _ret++;
        if (pos[*_s] != 0)
        {
            _ret = i - pos[*_s];  
            reBuildValuePtr = s + pos[*_s];
            memset(pos, 0, sizeof(int) * 128);
            for (; reBuildValuePtr <= _s; reBuildValuePtr++)
            {
                pos[*reBuildValuePtr] = reBuildValuePtr - s + 1;
            }                     
        }

        pos[*_s] = i;

        if (_ret > ret)
        {
            ret = _ret;
        }
        _s++;
    }
    return ret;
}

int main()
{
    printf("%d\n", lengthOfLongestSubstring("bbtablud"));
    return 0;
}